package Lista1
import scala.annotation.tailrec

/*
 * Ler 10 números do teclado e exibir o menor e o maior
 */
object q08 {
  def main(args: Array[String]): Unit = {
    println("Preencha o vetor: ")
    val v = new Array[Int](10)
    v(0) = readInt()
    var menor, maior = v(0)
    println("Preencha o vetor: ")
    for (i <- 1 to 9) {
      v(i) = readInt()
    }
    for (i <- 0 to 9) {
      if (v(i) < menor)
        menor = v(i)
      if (v(i) > maior)
        maior = v(i)
    }
    println("Menor valor: " + menor)
    println("Maior valor: " + maior)
  }
}

/*
 * Versão imperativa melhorada
 */
object q08a extends App {
  println("Preencha o vetor: ")
  var menor = readInt()
  var maior = menor
  for (i <- 2 to 10) {
    val x = readInt()
    menor = if (x < menor) x else menor
    maior = if (x > maior) x else maior
  }
  printf("menor=%d, maior=%d", menor, maior)
}

/*
 * Versão com funções
 */
object q08b extends App {
  def menorMaior(n: Int) = {
      @tailrec
      def f(n: Int, menor: Int, maior: Int): (Int, Int) = {
        if (n == 0) (menor, maior)
        else {
          val x = readInt()
          val novoMenor = if (x < menor) x else menor
          val novoMaior = if (x > maior) x else maior
          f(n - 1, novoMenor, novoMaior)
        }
      }
    println("Preencha o vetor: ")
    val primeiro = readInt()
    f(n - 1, primeiro, primeiro)
  }

  val (menor, maior) = menorMaior(10)
  printf("menor=%d, maior=%d", menor, maior)
}

object q08c extends App {
  def menorMaior(vetor: List[Int]): (Int, Int) = {
      @tailrec
      def f(vetor: List[Int], menor: Int, maior: Int): (Int, Int) = {
        vetor match {
          case x :: xs => f(xs, if (x < menor) x else menor, if (x > maior) x else maior)
          case _       => (menor, maior)
        }
      }
    f(vetor, vetor.head, vetor.head)
  }
  println("Preencha o vetor: ")
  val vetor = for (_ <- 1 to 10) yield readInt()
  val (menor, maior) = menorMaior(vetor.toList)
  printf("menor=%d, maior=%d", menor, maior)
}

/*
 * Versão funcional
 */
object q08d extends App {
  println("Preencha o vetor: ")
  val vetor = for (_ <- 1 to 10) yield readInt()
  val ordenado = vetor.sortWith(_ < _)
  val menor = ordenado.head
  val maior = ordenado.last
  printf("menor=%d, maior=%d", menor, maior)
}